home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / strategy / xpat2-1.000 / xpat2-1 / xpat2-1.04 / src / util.c < prev    next >
C/C++ Source or Header  |  1994-04-22  |  2KB  |  82 lines

  1. /*****************************************************************************/
  2. /*                                         */
  3. /*                                         */
  4. /*    X patience version 2 -- module util.c                     */
  5. /*                                         */
  6. /*    actually, this file contains a portable random-number-generator         */
  7. /*    written by Heiko Eissfeldt and Michael Bischoff                 */
  8. /*    see COPYRIGHT.xpat2 for Copyright details                 */
  9. /*                                         */
  10. /*  \begin{cite}                            */
  11. /*  This following lines contain a set of c-language functions for    */
  12. /*  generating uniform integers.   This is a COMPLETELY PORTABLE    */
  13. /*  generator.                                */
  14. /*  It will give IDENTICAL sequences of random numbers for any        */
  15. /*  architecture with at least 30-bit integers, regardless of the    */
  16. /*  integer representation, MAXINT value, or roundoff/truncation    */
  17. /*  method, etc.                                                     */
  18. /*                                    */
  19. /*  This Truly Remarkable RNG is described more fully in             */
  20. /*  J. Bentley's column, ``The Software Exploratorium ''                */
  21. /*  to appear in Unix Review in 1991.                                   */
  22. /*  It is based on one in Knuth, Vol 2, Section 3.2.2 (Algorithm A)     */
  23. /*  \end{cite}                                */
  24. /*                                    */
  25. /*  I got it from the DIMACS (netflow) archive at Rutgers University    */
  26. /*  and modified it a bit to make it work for 16-bit ints, but 32-bit   */
  27. /*  longs also.                                */
  28. /*            Michael                        */
  29. /*                                         */
  30. /*****************************************************************************/
  31. #include "xpatgame.h"
  32.  
  33.  
  34. /*----RNG Global Variables-------*/ 
  35.  
  36. static int rand_a = 24; 
  37. static int rand_b = 0;
  38. static long arr[55];  
  39.  
  40. /*----RNG Initializer------------*/
  41. /* Call once before using lprand */ 
  42.  
  43. void sprand(long seed) {
  44.     int i, ii;
  45.     long last, next;
  46.     arr[0] = last = seed; 
  47.     next = 1;
  48.     for (i=1; i < 55; i++) {
  49.         ii = ( 21 * i ) % 55;
  50.     arr[ii] = next;
  51.         next = last - next; 
  52.         if (next < 0)
  53.               next += PRANDMAX;
  54.         last = arr[ii];
  55.     }
  56.  
  57.     rand_a = 0;
  58.     rand_b = 24; 
  59.     for (i = 0; i < 165; i++) 
  60.         (void)prand();
  61. }
  62.  
  63. /*---------RNG---------------------*/
  64. /* Returns long integers from the  */
  65. /* range 0...PRANDMAX-1            */ 
  66.  
  67. long prand(void) {
  68.     long t;
  69.     if (rand_a-- == 0)
  70.     rand_a = 54;
  71.     if (rand_b-- == 0)
  72.     rand_b = 54;
  73.  
  74.     t = arr[rand_a] - arr[rand_b];
  75.  
  76.     t %= PRANDMAX;
  77.     if (t < 0)
  78.     t += PRANDMAX;
  79.     arr[rand_a] = t;
  80.     return t;
  81. }
  82.